/**
 * 这是 sgame 配套测试 json 编码解析器的 socket 服务器
 * 你可以直接使用 node 启动它
 * npm install
 * node server.js
 */

const WebSocket = require('ws');

const port = 8999;

// 创建WebSocket服务器
const wss = new WebSocket.Server({ port });

function encode(protoId, data) {
    return JSON.stringify([protoId, data]);
}

function decode(message) {
    return JSON.parse(message);
}

let handler = new Map();
handler.set(1, (ws, data) => {
    ws.send(encode(1, data));
    console.log("send", 1, 'send to client: ' + data);
});

handler.set(2, (ws, data) => {
    // 等待 3s 后发送
    setTimeout(() => {
        ws.send(encode(2, data));
        console.log("sendHalt", 2, 'send halt to client: ' + data);
    }, 3000);
});

wss.on('connection', (ws) => {
    console.log('客户端已连接');

    // 当接收到客户端的消息时
    ws.on('message', (message) => {
        console.log(`接收到消息: ${message}`);

        let [protoId, data] = decode(message);
        let func = handler.get(protoId);
        if (!func) {
            console.error(`没有协议: ${protoId} 处理器`);
            return;
        }

        func(ws, data);
    });

    // 发送消息到客户端
    ws.send(encode(0, '你好！欢迎连接到WebSocket服务器。'));

    // 当连接关闭时
    ws.on('close', (code, reason) => {
        console.log('客户端已断开连接', code, reason);
    });
});

console.log(`WebSocket服务器正在监听端口: ${port}\n`);